[アップデート] Amazon SES でサプレッションリストの登録と削除を一括で実行できるようになりました

[アップデート] Amazon SES でサプレッションリストの登録と削除を一括で実行できるようになりました

Amazon SESのサプレッションリストの一括登録と削除が簡単になりました!
Clock Icon2020.08.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon SES のアカウントレベルのサプレッションリストから、メールアドレスの登録と削除を一括で実行できるようになりました。

なにが嬉しいのか

サプレッションリストとは、受信者からの配信停止リクエストや迷惑メール報告などにより、メールを配信できないメールアドレスのリストのことです。配信停止リクエストや迷惑メール報告がされているにも関わらずメール送ってしまうと、送信元ドメインや Amazon SES の IP アドレスプールのレピュテーションが落ちてしまいます。そのため、メールの配信者はサプレッションリストを用いて、配信しないメールアドレスを適切に管理することが求められます。

これまでサプレッションリストは、各メールアドレスごとに追加や削除をしなくてはなりませんでした。配信停止リクエストや迷惑メール報告をトリガーに追加する分には不便ありませんが、Amazon SES への移行や検証フェーズにおいて、一括追加するに時間がかかっておりました。
アップデートによって、サプレッションリストに一括で登録するプロセスの時間が短縮され、リストを CSV または JSON で管理できるように運用性も上がりました。

やってみた

サプレッションリストを有効化し、メールアドレスの一括登録と一括削除を試してみます。
マネージメントコンソールからサプレッションリストの更新や削除はできないため、今回は AWS CLI を使います。

サプレッションリストを有効化

まず Configuration set を作成します。Configuration set は、Amazon SES で送信するメールに適用できるルールのグループです。

$ aws sesv2 create-configuration-set --configuration-set-name configSet

サプレッションリストを有効化します。

$ aws sesv2 put-configuration-set-suppression-options \
    --configuration-set-name configSet \
    --suppressed-reasons BOUNCE COMPLAINT

サプレッションリストが有効化されていることを確認します。

$ aws sesv2 get-configuration-set --configuration-set-name configSet
{
    "ConfigurationSetName": "configSet",
    "ReputationOptions": {
        "ReputationMetricsEnabled": true
    },
    "SendingOptions": {
        "SendingEnabled": true
    },
    "Tags":[],
    "SuppressionOptions": {
        "SuppressedReasons":[
            "BOUNCE",
            "COMPLAINT"
       ]
    }
}

サプレッションリストの一括登録

サプレッションリストを作成します。形式は CSV または JSON がサポートされており、CSV の場合は以下のようにメールアドレスと **BOUNCE/COMPLAINT(バウンスまたは苦情)**を指定します。
サプレッションリストに登録できるアドレス数に制限はありませんが、API の呼び出しごとに登録できる件数は 100,000 件となるため、100,000 件を超える場合はファイルを分割します。

ses-bounce-1@example.com,BOUNCE
ses-bounce-2@example.com,BOUNCE
ses-bounce-3@example.com,BOUNCE
ses-complaint-1@example.com,COMPLAINT
ses-complaint-2@example.com,COMPLAINT
ses-complaint-3@example.com,COMPLAINT

一括登録するは、作成したサプレッションリストを S3 にアップロードし、Amazon SES で読み取らせる必要があります。登録するための S3 を作成し、サプレッションリストをアップロードします。
バケット名をses-suppression-list-bucket、オブジェクト名をsuppressed_list.csvとします。

aws s3 mb s3://nakagawa-suppression-list-bucket
aws s3 cp suppressed_list.csv s3://suppression-list-bucket/suppressed_list.csv 

Amazon SES がオブジェクトを読み取るたるためにバケットポリシーを変更します。
ローカルでバケットポリシーを定義したファイル(suppression-list-bucket-policy.json)を作成します。14 行の AWSACCOUNTID は AWS アカウント番号に変更します。

{
    "Version": "2012-10-17",
    "Statement":[
        {
            "Sid": "AllowSESGet",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::suppression-list-bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "AWSACCOUNTID"
                }
            }
        }
  ]
}

バケットポリシーを変更します。

aws s3api put-bucket-policy --bucket suppression-list-bucket --policy file://suppression-list-bucket-policy.json

準備ができましたので、サプレッションリストに一括でメールアドレスを登録します。登録時は SuppressionListImportAction で PUT を指定します。

$ aws sesv2 create-import-job \
    --import-destination SuppressionListDestination={SuppressionListImportAction=PUT} \
    --import-data-source S3Url=s3://suppression-list-bucket/suppressed_list.csv,DataFormat=CSV
{
    "JobId": "609b0ee1-a9af-4d18-bd4c-xxxxxxxxxxxx"
}

サプレッションリストを確認します。

$ aws sesv2 list-suppressed-destinations
{
    "SuppressedDestinationSummaries":[
        {
            "EmailAddress": "ses-bounce-1@example.com",
            "Reason": "BOUNCE",
            "LastUpdateTime": 1598415391.946
        },
        {
            "EmailAddress": "ses-complaint-1@example.com",
            "Reason": "COMPLAINT",
            "LastUpdateTime": 1598415391.946
        },
        {
            "EmailAddress": "ses-complaint-2@example.com",
            "Reason": "COMPLAINT",
            "LastUpdateTime": 1598415391.946
        },
        {
            "EmailAddress": "ses-bounce-2@example.com",
            "Reason": "BOUNCE",
            "LastUpdateTime": 1598415391.946
        },
        {
            "EmailAddress": "ses-complaint-3@example.com",
            "Reason": "COMPLAINT",
            "LastUpdateTime": 1598415391.946
        },
        {
            "EmailAddress": "ses-bounce-3@example.com",
            "Reason": "BOUNCE",
            "LastUpdateTime": 1598415391.946
        }
 ]
}

登録できていることを確認できました。

サプレッションリストの一括削除

続いて、一括削除の手順をやってみます。
先程と同じように、削除するメールアドレスのリストを作成します。注意として、削除の際は BOUNCE や COMPLAINT のフィールドは不要になるため、すべて削除する場合もリストは新規作成が必要です。

サプレッションリストから削除するメールアドレスのリスト(suppressed_delete_list.csv)を以下の通り作成しました。ここではバウンスで登録したメールアドレスを削除します。

ses-bounce-1@example.com
ses-bounce-2@example.com
ses-bounce-3@example.com

削除リストを S3 アップロードします。

aws s3 cp suppressed_delete_list.csv s3://suppression-list-bucket/suppressed_delete_list.csv

サプレッションリストを一括削除します。削除時は SuppressionListImportAction では DELETE を指定します。

$ aws sesv2 create-import-job \
    --import-destination   SuppressionListDestination={SuppressionListImportAction=DELETE} \
    --import-data-source S3Url=s3://suppression-list-bucket/suppressed_delete_list.csv,DataFormat=CSV
{
    "JobId": "c5b2c84a-0160-4d0e-aff3-xxxxxxxxxxxx"
}

サプレッションリストを確認します。

$ aws sesv2 list-suppressed-destinations
{
    "SuppressedDestinationSummaries":[
        {
            "EmailAddress": "ses-complaint-1@example.com",
            "Reason": "COMPLAINT",
            "LastUpdateTime": 1598415391.946
        },
        {
            "EmailAddress": "ses-complaint-2@example.com",
            "Reason": "COMPLAINT",
            "LastUpdateTime": 1598415391.946
        },
        {
            "EmailAddress": "ses-complaint-3@example.com",
            "Reason": "COMPLAINT",
            "LastUpdateTime": 1598415391.946
        }
 ]
}

バウンスで登録したメールアドレスが削除され、一括削除できたことを確認できました。

さいごに

Amazon SES でサプレッションリストの登録と削除を一括で実行できるようになり、新規で SES を利用する際や移行時に便利になりました。
サプレッションリストを CSV 形式で保持できるようになり、運用の観点でも嬉しくなったと思います!

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.